package day02;

public class Exercise {
    public static void main(String[] args) {
        //1. 变量的练习：
        int a;
        int b,c,d,e;
        int f = 1;
        int z;
        z = 100;
        int g = 3;
        int h = g + 10;
        System.out.println(h);
        g = g+10;
        System.out.println(g);
        //声明一些正确的和错误的变量名
        int a1,a_b,a_4$_,$_b;
        /*int a*b;  编译错误 ，不能包含*号等特殊符号
        int 1a;   编译错误，不能以数字开头，严格区分大小写，不能使用关键字，中文允许输入但是不建议
        小驼峰命名法:首个单词首字母小写，其余单词首字母大写
        大驼峰命名法:所有单词首字母都大写
        */


        //2.基本数据类型的练习(byte short int long float double boolean char)
        //1) int:整型，4个字节    范围-21个多亿到21个多亿
        //声明一个整型变量时会默认为int类型，但超出int范围会报错
        int a21 = 25;
        //int b21 = 10000000000;   100亿默认为int类型，但是超出了int的范围。
        int max = 2147483647;       //此数值为int的最大值
        System.out.println(max + 1);//此结果为-2147483648，发生了溢出，需要避免


        //2)long:长整型，8个字节   范围-900万万亿多到900万万亿多
        long a22 = 10L;
        //long b22 = 10000000000;     //100亿默认为int型，超出了int范围需要在后面加L才不会报错
        long c22 = 10000000000L;
        long d22 = 1000000000*2*10L;
        System.out.println(d22); //结果为200亿
        long e22 = 1000000000*3*10L;
        System.out.println(e22); //结果不是300亿
        long f22 = 1000000000L*3*10;  //运算若有可能溢出，建议在第1个数字后加L
        System.out.println(f22); //300亿

        //3)double: 浮点型，8个字节，范围很大很大，浮点型直接量默认为double类型
        double a23 = 3.222222;  // 默认为double类型
        float b23 = 2.33333F; //在后面加F或f即可成为float型
        double c23 = 4.0, d23 = 3.9;
        System.out.println(c23-d23);//此结果为0.10000000000000009，有可能会发生舍入误差


        //4)boolean :布尔型，1个字节   true false为布尔类型的两个直接量，其余赋值全为编译错误
        boolean a24 = true;
        boolean b24 = false;
        //boolean c24 = 23;   编译错误


        //5)char:字符型，2个字节        0----48     A----65      a----97
        char a25 = '男';
        char b25 = ' ';
        char c25 = 'a';
        char d25 = '+';
        //char e25 = '';    编译错误，必须有字符
        //char f25 = '女孩';    编译错误，只能有一个字符


        //3.类型间的转换:两种方式、两点规则
        /*两种方式:
        自动转:数据类型由小类型转向大类型
        强制转:数据类型由大类型转向小类型
        数据类型由小到大依次为:byte<short<int<long<float<double    char<int
         */
        int a3 = 3;
        long b3 = a3;   //自动类型转换
        long c3 = 5;    //自动类型转换
        double d3 = 5;  //自动类型转换
        int e3 = (int)c3;  //强制类型转换，c3有long型强制转换为int型
        long  f3 = 10000000000L;
        int g3 = (int)f3;
        System.out.println(g3);//1410065408  强制转换可能会发生溢出
        double h3 = 25.987;
        int i3 = (int)h3;
        System.out.println(i3); //25，强转有可能丢失精度
        /*两种规则:整数直接量可以直接赋值给byte,short,char,但不能超出范围
                 byte，short，char型数据参与运算时，系统一律将其转换为int在运算
        */
        byte a31 = 5;
        byte b31 = 7;
        byte c31 =(byte) (a31+b31);
        System.out.println(3+5);   //8
        System.out.println('2'+'4');//102
        System.out.println(2+'2');//52

        int d31 = '你';      //看字符对应的码
        System.out.println(d31);//20320
        char e31 = 97;      //看码对应的字符
        System.out.println(e31);//a

        /*
        * 1GB = 1024MB(兆)
        * 1MB = 1024KB(千字节)
        * 1KB = 1024B(字节)
        * 1B = 8bit (位)*/
    }
}
